﻿// 1003 行进路线.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>

using namespace std;
/*
http://oj.daimayuan.top/course/7/problem/547

小蜗在玩一个游戏，游戏里有一张平面地图，他需要从坐标 (0,0)点移动到坐标 (xe,ye)点。

基于游戏设定，整张地图都十分危险，小蜗不能踏入其中。幸运的是，地图中存在 n个安全区域，
第 i个安全区域是由圆心在坐标 (xi,yi)点，效果半径为 ri的圆形信标展开形成的，安全区域可以相互重叠。
特别的，除了上述 n个安全区域，还存在一个圆心坐标为 (0,0)点，效果半径为 1的安全区域。

小蜗只能在安全区域中移动，如果两个安全区域相交或相切，小蜗可以从其中一个安全区域走到另一个安全区域。
请问小蜗能不能顺利到达终点？能的话输出 1，不能输出 0。

输入格式
输入包含多组测试数据。

第一行一个整数 T，表示数据组数。

对于每组数据，第一行两个整数 xe,ye，表示终点坐标。

接下来一行一个整数 n，表示安全区域的总数（不包括特别的那个安全区域）。

接下来 n行，每行三个整数 xi,yi,ri，表示一个安全区域。

输出格式
对于每组数据，输出一行一个数表示答案。

样例输入
1
0 3
2
-3 0 2
-3 7 5
样例输出
1
数据规模
对于所有数据，保证 1≤T≤10,1≤n≤1000,−108≤xi,yi,xe,ye≤108,1≤ri≤108。
*/

const int N = 1010;

struct point {
	int x; int y; int r;
}pts[N];
int f[N];
int n, t;

void init() {
	for (int i = 0; i < N; i++) {	f[i] = i;}
	pts[0].x = 0, pts[0].y = 0, pts[0].r = 1;
}

int find(int x) {
	if (f[x] != x) { f[x] = find(f[x]); }
	return f[x];
}

void merge(int a, int b) {
	f[find(a)] = find(b);
}

void solve() {
	init();
	cin >> pts[1].x >> pts[1].y; pts[1].r = 0;
	cin >> n;
	n += 2;
	for (int i = 2; i < n; i++) {
		cin >> pts[i].x >> pts[i].y >> pts[i].r;
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (find(i) == find(j)) { continue; }
			else {
				long long dis = 1LL*abs(pts[i].x - pts[j].x) * abs(pts[i].x - pts[j].x) +
					1LL*abs(pts[i].y - pts[j].y) * abs(pts[i].y - pts[j].y);
				if (dis <= 1LL*(pts[i].r + pts[j].r) * (pts[i].r + pts[j].r)) {
					merge(i, j);
				}
			}
		}
	}
	if (find(0) == find(1)) {
		cout << 1 << endl;
	}
	else {
		cout << 0 << endl;
	}
	
}


int main()
{
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}
 